package feed.dao;
import feed.conexion.DataBaseInstance;
import static feed.conexion.DataBaseInstance.closeConnection;
import feed.entity.Cuenta;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JOptionPane;

public class CuentaDao {
    
    protected Connection getConnection() {
        return DataBaseInstance.getInstanceConnection();
    }
    public void save(Cuenta cuenta) {
        PreparedStatement saveCuenta;
        try {
            saveCuenta = getConnection().prepareStatement(
                    "INSERT INTO APP.cuenta (nombre, descripcion) VALUES ( ?, ?)");
            
            saveCuenta.setString(1, cuenta.getNombre());
            saveCuenta.setString(2, cuenta.getDescripcion());
            saveCuenta.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public void update(Cuenta cuenta) {
        PreparedStatement saveCuenta;
        try {
            saveCuenta = getConnection().prepareStatement(
                 "UPDATE APP.cuenta SET idtipocuenta = ?, nombre = ?, descripcion = ? WHERE  id = ?");
            saveCuenta.setInt(1, cuenta.getIdtipocuenta());
            saveCuenta.setString(2, cuenta.getNombre());
            saveCuenta.setString(3, cuenta.getDescripcion());
            saveCuenta.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void delete(Cuenta cuenta) {
        PreparedStatement delCuenta;
        try {
            delCuenta = getConnection().prepareStatement(
                    "DELETE FROM APP.cuenta WHERE id = ?");
            delCuenta.setInt(1, cuenta.getId());
            delCuenta.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(null, "No se ha podido realizar la operación!\n\n"+se, "Error de datos", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    public List<Cuenta> findAll() {
        List<Cuenta> listaCuentas = new LinkedList<Cuenta>();
        ResultSet result = null;
        try {
            String query = "SELECT * FROM APP.CUENTA";
            Statement stmt = getConnection().createStatement();
            result = stmt.executeQuery(query);
            while (result.next()) {
                Cuenta cuenta = new Cuenta();
                cuenta.setId(result.getInt("id"));
                cuenta.setIdtipocuenta(result.getInt("idtipocuenta"));
                cuenta.setNombre(result.getString("nombre"));
                cuenta.setDescripcion(result.getString("descripcion"));
                listaCuentas.add(cuenta);
            }
            result.close();
            stmt.close();
            closeConnection();
        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaCuentas;
    }
    
    public Object [][] getCuenta(){
        int posid = 0;
        try{
            PreparedStatement pstm = getConnection().prepareStatement("SELECT count(1) as total FROM app.cuenta");
            ResultSet res = pstm.executeQuery();
            res.next();
            posid = res.getInt("total");
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        Object[][] data = new String[posid][3];
        try{
            PreparedStatement pstm = getConnection().prepareStatement("SELECT idtipocuenta,nombre,descripcion FROM app.cuenta");
            ResultSet res = pstm.executeQuery();
            int increment = 0;
            while(res.next()){
                String estIdtipocuenta = res.getString("idtipocuenta");
                String estNombre = res.getString("nombre");
                String estDescripcion = res.getString("descripcion");
                data[increment][0] = estIdtipocuenta;
                data[increment][1] = estNombre;
                data[increment][2] = estDescripcion;
                increment++;
            }
            res.close();
            }catch(SQLException e){
                JOptionPane.showMessageDialog(null, e);
        }
        return data;
    }

    protected void closeConnection() {
        DataBaseInstance.closeConnection();
        System.out.println("Conexion cerrada...");
    }
}
